package base_util

import (
	"github.com/goccy/go-json"
	"go.uber.org/zap"
)

// ToJSON 将任意类型对象序列化为 JSON 字符串
// 参数：v 任意对象（结构体、切片、map 等）
// 返回值：json 字符串，或错误信息
func ToJSON(v any) (string, error) {
	bytes, err := json.Marshal(v)
	if err != nil {
		zap.S().Errorw("对象转 JSON 字符串失败", "对象", v, "错误", err)
		return "", LogicError("对象转 JSON 字符串失败")
	}
	return string(bytes), nil
}

// FromJSON 将 JSON 字符串反序列化为任意对象（必须传入指针）
// 参数：jsonStr 要解析的 JSON 字符串，out 输出对象指针（如：&[]T）
// 返回值：是否成功
func FromJSON(jsonStr string, out any) error {
	if err := json.Unmarshal([]byte(jsonStr), out); err != nil {
		zap.S().Errorw("JSON 字符串转对象失败", "JSON", jsonStr, "错误", err)
		return LogicError("JSON 字符串转对象失败")
	}
	return nil
}
